iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

Volume

Volume 隸屬於Pod, 主要用在資料保存與數據分享, Pod內部的所有容器都可以共享Volume, 他放在Pod外部的某個儲存裝置上面, 可以獨立於Pod的生命週期之外, 實現數據持久化。

https://ithelp.ithome.com.tw/upload/images/20200925/20129656dWDeQDWde5.png

  • K8s支援的Volume 類型舉例: 詳細類型參考
    • emptyDirhostPath 屬於節點級別的Volume, 非持久型, emptyDir生命週期和Pod相同, 使用hostPath的Pod一旦被重新調度到其他節點就不能再使用這個Volume。
    • 網路儲存系統有:nfs, cephfs, glusterfs, gcePersistentDisk, awsElasticBlockStore
    • persistentVolumeClaim: 用戶會透過 persistentVolumeClaimPersistentVolume 申請使用內部存放的持久型數據。(後面補充)
    • Secret and ConfigMap: Secret 用於傳遞敏感資料, ConfigMap用於注入非敏感資料到Pod裡面, 可以幫助實現Pod配置集中化管裡。

Volume 配置

spec可以掛載volume的字段有volumescontainers.volumeMounts; volumes 是定義在Pod上面的Volume, 可以支援多種類型且配置參數差異很大, containers.volumeMounts 是在容器上定義掛載列表, 只能掛當前Pod有的實體Volume, 也可以不掛任何Volume, volumescontainers.volumeMounts都是列表格式。實際上如果Pod裡面只有一個容器的時候, 掛Volume的目的就不在於共享, 而是在數據持久化。

  • spec 格式

    spec:
      ...
      containers:
      - name: <String>
    ...
    volumeMounts:
    - name: <string> 
      mountPath: <string>
      readOnly: <bool>
      subPath: <string>
    
    • name: 必填, 要掛在的數據名稱
    • mountPath: 必填, 掛載路徑,容器文件系統路徑
    • readOnly: 是否只能讀不能寫
    • subPath: 掛載子路徑, 在mountPath底下要接的路徑

臨時空間類型: emptyDir

Pod啟動時創建的一個臨時目錄, Pod移除時也會一併被移除, 只適用於在同一Pod裡面的容器間數據共享或做為容器間的緩存。
spec 字段包含兩個內容:

  1. medium: 儲存媒介類型, 預設default, 或可用Memory, Memory表示基於RAM的臨時文件系統tmpfs, 通常用來作為緩存。
  2. sizeLimit: 儲存空間限額, 預設nil, 表示不限制, 但在medium設定為Memory時建議要一併設定此參數

節點Volume hostpath 類型

hostpath 是指將Node上面某個文件系統的目錄或資料夾掛載到Pod上面的Volume, 它獨立在Pod生命週期之外, 具有持久性。
spec 字段包含兩個內容:

  1. path: 必填, 指定Node上的目錄路徑
  2. type: 指定volume類型

網路Volume

獨立於cluster Node的持久性Volume。

  • NFS
    NFS(Network File System) 是一種分布式文件系統協議, 支援client主機透過網路訪問服務器上的文件, 是由內核原生支援的網路文件系統, 屬於系統級的共享服務。
    emptyDir 不同的是, NFS在Pod終止後只是被卸載而非刪除。
    spec 字段包含:

    • server <string>: 必填, NFS服務器IP地址或主機名稱
    • path <string>: 必填, NFS提供共享的文件系統路徑
    • readOnly <boolean>: 預設false, 是否只能讀不能寫
  • RDB

    RDB類型的Volume有Ceph, Cepg是分布式的儲存系統平台, 具備幾個特性: 可擴展, 高可靠, 效能高; 能同時支援區塊設備, 文件系統和REST三種儲存接口, 提供用於監控儲存叢集的介面, 還包含驗證與授權的功能, 可以兼容多種接口。

    要配置RDB需要幾個條件:

    • 存在可用的Ceph RDB cluster
    • 在Ceph RDB cluster創建一個Pod儲存數據用的image
    • 在k8s cluster各Node安裝Ceph client 程序(ceph-common)

    spec 字段包含:

    • monitors <[]string>: 必填, Ceph 儲存監視器, 是以逗號分隔的字符串列表
    • image <string>: 必填, rados image 名稱
    • pool <string>: rados 儲存持名稱, 預設RDB
    • user <string>: rados 用戶名稱, 預設admin
    • keyring <string>: RDB用戶認證時使用的keyring文件路徑, 預設/etc/ceph/keyring
    • secretRef <Object>: 保存RDB用戶認證資訊的Serect 名稱, 會覆蓋keyring的私鑰
    • readOnly <boolean>: 是否只能讀不能寫
    • fsType <boolean>: 要掛載的文件類型, 需要是節點操作系統支持的文件系統, 例如: ext4, xfs, ntfs, 預設ext4
  • GlusterFS
    GlusterFS (Gluster File System) 是一種開源的分布式文件系統, Gluster的核心, 支援橫向擴展。GlusterFS設計為一個可堆疊的用戶空間, 透過TCP/IP或 InfiniBand RDMA網路執行把物理分佈的儲存資源聚集在一起, 使用單一全域的命名空間來控管數據。

    要配置GlusterFS需要幾個條件:

    • 存在可用的 GlusterFS cluster
    • 在 GlusterFS cluster創建一個Pod儲存數據用的Volume
    • 在k8s cluster各Node安裝 GlusterFS client 程序(glusterfs和glusterfs-fuse)

    若要在GlusterFS使用動態供給機制可以部署heketi, heketi可以為 GlusterFS cluster提供RESTful風格的管理接口。

    spec字段包含:

    • endpoints <string>: 必填, Endpoints 名稱, 用來提供GlusterFS cluster節點訊息作為其訪問接口
    • path <string>: 必填, 用到的 GlusterFS cluster volume 路徑
    • readOnly <boolean>: 是否只能讀不能寫
  • Cinder
    Cinder 是OpenStack Block Storage的項目名稱, 用來提供虛擬機(VM)持久區塊儲存功能。Cinder支持多種後端儲存方式, 包含LVM, NFS, Ceph等, 其具備Restful API功能, 並能調度Volume創建的請求, 進而優化儲存資源的分配。
    將K8s部署於 OpenStack 構建的IaaS環境中時, Cinder的區塊儲存功能可以為Pod提供外部持久化儲存方式。

    spec字段包含:

    • volumeID <string>: 必填, 用來識別別Cinder內各個Volume的識別符
    • readOnly <boolean>: 是否只能讀不能寫
    • fsType <boolean>: 要掛載的文件類型, 需要是節點操作系統支持的文件系統, 例如: ext4, xfs, ntfs, 預設ext4

今日小結

沒想到Volume有這麼多種類及組合方式, 由Volume延伸出去可以研讀的項目很多, 之後再補延伸知識了。
最近這幾篇都無法一天讀完一個項目, 每個項目裡面包含的東西不少, 我一邊看一邊過濾目前需不需要去深究看到的名詞或是議題, 盡量把範圍抓好, 不要讓自己掉得太深。

鐵人賽來到學習K8s的第17天, 開始想要一邊喝酒一邊寫是正常的嗎?


上一篇
day 16 Service and Ingress(2)- Ingress
下一篇
day 18 Volume(2) - Persistent Volume
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言